home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 423_01 / recio200 / _rcputf.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-15  |  2.8 KB  |  81 lines

  1. /*****************************************************************************
  2.    MODULE: _rcputf.h
  3.   PURPOSE: recio column delimited floating point output functions
  4. COPYRIGHT: (C) 1994 William Pierpoint
  5.   VERSION: 2.00
  6.   RELEASE: April 15, 1994
  7. *****************************************************************************/
  8.  
  9. #ifndef _RCPUTF_H
  10. #define _RCPUTF_H
  11.  
  12. #include "recio.h"
  13.  
  14. extern int _rstatus(REC *rp, int mode);
  15. extern int _rputc(REC *rp, int ch);
  16.  
  17. #define rfp(rp)          ((rp)->r_fp)
  18. #define rcol(rp)         ((rp)->r_colno)
  19. #define rfldch(rp)       ((rp)->r_fldch)
  20.  
  21. /* macro to put column delimited floating point number */
  22. #define rcput_fn( /* define function to put number to record stream */\
  23.     fn_type,      /* defined function number type */\
  24.     fn_name,      /* defined function name */\
  25.     cv_type,      /* conversion function type */\
  26.     cv_name,      /* conversion function name */\
  27.     cv_dig)       /* conversion number of significant digits */\
  28. \
  29. int                          /* return 0 on success; !0 on error */\
  30.     fn_name(                 /* put string to record stream      */\
  31.         REC    *rp,          /* record pointer                   */\
  32.         size_t begcol,       /* field inclusive beginning column */\
  33.         size_t endcol,       /* field inclusive ending column    */\
  34.         fn_type num)         /* number to put to stream          */\
  35. { \
  36.     int err=EOF;             /* return error (0=no error; !0=error) */\
  37.     size_t sl;               /* length of string _r_nsbuf */\
  38.     int dig;                 /* significant digits */\
  39.     if (!_rstatus(rp, R_WRITE)) { \
  40.       if (endcol >= begcol && begcol >= rcolno(rp)) { \
  41.         rfldno(rp)++; \
  42.         /* if colno < begcol, pad with spaces */\
  43.         while (rcolno(rp) < begcol) { \
  44.           err = _rputc(rp, ' '); \
  45.           if (err) goto done; \
  46.         } \
  47.         dig = min((cv_dig), (endcol-begcol+1)); \
  48.         while (dig > 0) { \
  49.           cv_name((cv_type) num, dig, _r_nsbuf); \
  50.           sl = strlen(_r_nsbuf); \
  51.           if (sl <= (endcol-begcol+1)) { \
  52.             while (rcolno(rp) <= endcol-sl) { \
  53.               err = _rputc(rp, ' '); \
  54.               if (err) goto done; \
  55.             } \
  56.             err = fputs(_r_nsbuf, rfp(rp)); \
  57.             if (err==EOF) { \
  58.               rseterr(rp, R_ENOPUT); \
  59.             } else { \
  60.               rcol(rp) += sl; \
  61.               err = 0; \
  62.             } \
  63.             goto done; \
  64.           } \
  65.           dig -= sl-(endcol-begcol+1); \
  66.         } \
  67.         /* converted string too long for space */\
  68.         rsetwarn(rp, R_WWIDTH); \
  69.         while (rcolno(rp) <= endcol) { \
  70.           err = _rputc(rp, '*'); \
  71.         } \
  72.       } else { \
  73.         rseterr(rp, R_EINVAL); \
  74.       } \
  75.     } \
  76. done: \
  77.     return err; \
  78. }
  79.  
  80. #endif
  81.